package com.kexio.file.vo;

import java.time.LocalDateTime;

import com.fasterxml.jackson.annotation.JsonFormat;

/**
 * 文件信息 - 视图对象
 * 
 * @author Kexio Team
 * @since 1.0.0
 * @description 用于接口返回脱敏/展示友好的字段
 */
public class FileInfoVO {
    
    /** 文件ID */
    private String id;
    
    /** 存储对象ID */
    private String storageObjectId;
    
    /** 文件原始名称 */
    private String originalName;
    
    /** 文件显示名称 */
    private String displayName;
    
    /** 文件扩展名 */
    private String fileExtension;
    
    /** MIME类型 */
    private String mimeType;
    
    /** 文件大小（字节） */
    private Long fileSize;
    
    /** 文件大小（人类可读格式） */
    private String humanReadableSize;
    
    /** 文件内容MD5哈希值 */
    private String contentMd5;
    
    /** 业务键 */
    private String businessKey;
    
    /** 业务类型/模块 */
    private String businessType;
    
    /** 标签 */
    private String tags;
    
    /** 文件状态 */
    private Integer status;
    
    /** 文件状态文本 */
    private String statusText;
    
    /** 是否公开访问 */
    private Boolean isPublic;
    
    /** 上传者ID */
    private String uploaderId;
    
    /** 上传者名称 */
    private String uploaderName;
    
    /** 上传IP地址 */
    private String uploadIp;
    
    /** 上传时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime uploadTime;
    
    /** 最后访问时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime lastAccessTime;
    
    /** 访问次数 */
    private Long accessCount;
    
    /** 下载次数 */
    private Long downloadCount;
    
    /** 过期时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime expireTime;
    
    /** 文件描述 */
    private String description;
    
    /** 文件类型（image/video/audio/document/other） */
    private String fileType;
    
    /** 是否已过期 */
    private Boolean expired;
    
    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    
    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    
    // ==================== Getter/Setter ====================
    
    public String getId() { return this.id; }
    public void setId(String id) { this.id = id; }
    
    public String getStorageObjectId() { return this.storageObjectId; }
    public void setStorageObjectId(String storageObjectId) { this.storageObjectId = storageObjectId; }
    
    public String getOriginalName() { return this.originalName; }
    public void setOriginalName(String originalName) { this.originalName = originalName; }
    
    public String getDisplayName() { return this.displayName; }
    public void setDisplayName(String displayName) { this.displayName = displayName; }
    
    public String getFileExtension() { return this.fileExtension; }
    public void setFileExtension(String fileExtension) { this.fileExtension = fileExtension; }
    
    public String getMimeType() { return this.mimeType; }
    public void setMimeType(String mimeType) { this.mimeType = mimeType; }
    
    public Long getFileSize() { return this.fileSize; }
    public void setFileSize(Long fileSize) { this.fileSize = fileSize; }
    
    public String getHumanReadableSize() { return this.humanReadableSize; }
    public void setHumanReadableSize(String humanReadableSize) { this.humanReadableSize = humanReadableSize; }
    
    public String getContentMd5() { return this.contentMd5; }
    public void setContentMd5(String contentMd5) { this.contentMd5 = contentMd5; }
    
    public String getBusinessKey() { return this.businessKey; }
    public void setBusinessKey(String businessKey) { this.businessKey = businessKey; }
    
    public String getBusinessType() { return this.businessType; }
    public void setBusinessType(String businessType) { this.businessType = businessType; }
    
    public String getTags() { return this.tags; }
    public void setTags(String tags) { this.tags = tags; }
    
    public Integer getStatus() { return this.status; }
    public void setStatus(Integer status) { this.status = status; }
    
    public String getStatusText() { return this.statusText; }
    public void setStatusText(String statusText) { this.statusText = statusText; }
    
    public Boolean getIsPublic() { return this.isPublic; }
    public void setIsPublic(Boolean isPublic) { this.isPublic = isPublic; }
    
    public String getUploaderId() { return this.uploaderId; }
    public void setUploaderId(String uploaderId) { this.uploaderId = uploaderId; }
    
    public String getUploaderName() { return this.uploaderName; }
    public void setUploaderName(String uploaderName) { this.uploaderName = uploaderName; }
    
    public String getUploadIp() { return this.uploadIp; }
    public void setUploadIp(String uploadIp) { this.uploadIp = uploadIp; }
    
    public LocalDateTime getUploadTime() { return this.uploadTime; }
    public void setUploadTime(LocalDateTime uploadTime) { this.uploadTime = uploadTime; }
    
    public LocalDateTime getLastAccessTime() { return this.lastAccessTime; }
    public void setLastAccessTime(LocalDateTime lastAccessTime) { this.lastAccessTime = lastAccessTime; }
    
    public Long getAccessCount() { return this.accessCount; }
    public void setAccessCount(Long accessCount) { this.accessCount = accessCount; }
    
    public Long getDownloadCount() { return this.downloadCount; }
    public void setDownloadCount(Long downloadCount) { this.downloadCount = downloadCount; }
    
    public LocalDateTime getExpireTime() { return this.expireTime; }
    public void setExpireTime(LocalDateTime expireTime) { this.expireTime = expireTime; }
    
    public String getDescription() { return this.description; }
    public void setDescription(String description) { this.description = description; }
    
    public String getFileType() { return this.fileType; }
    public void setFileType(String fileType) { this.fileType = fileType; }
    
    public Boolean getExpired() { return this.expired; }
    public void setExpired(Boolean expired) { this.expired = expired; }
    
    public LocalDateTime getCreateTime() { return this.createTime; }
    public void setCreateTime(LocalDateTime createTime) { this.createTime = createTime; }
    
    public LocalDateTime getUpdateTime() { return this.updateTime; }
    public void setUpdateTime(LocalDateTime updateTime) { this.updateTime = updateTime; }
}
